home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 11 / Info-Mac_XI_Disc_1.cdr_ / Info-Mac XI Disc 1.cdr / Programs / Science & Math / MacEspresso 1.0 / espresso / equiv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-26  |  2.0 KB  |  86 lines  |  [TEXT/R*ch]

  1. #include "espresso.h"
  2.  
  3.  
  4. find_equiv_outputs(PLA)
  5. pPLA PLA;
  6. {
  7.     int i, j, ipart, jpart, some_equiv;
  8.     pcover *R, *F;
  9.  
  10.     some_equiv = FALSE;
  11.  
  12.     makeup_labels(PLA);
  13.  
  14.     F = ALLOC(pcover, cube.part_size[cube.output]);
  15.     R = ALLOC(pcover, cube.part_size[cube.output]);
  16.  
  17.     for(i = 0; i < cube.part_size[cube.output]; i++) {
  18.     ipart = cube.first_part[cube.output] + i;
  19.     R[i] = cof_output(PLA->R, ipart);
  20.     F[i] = complement(cube1list(R[i]));
  21.     }
  22.     
  23.     for(i = 0; i < cube.part_size[cube.output]-1; i++) {
  24.     for(j = i+1; j < cube.part_size[cube.output]; j++) {
  25.         ipart = cube.first_part[cube.output] + i;
  26.         jpart = cube.first_part[cube.output] + j;
  27.  
  28.         if (check_equiv(F[i], F[j])) {
  29.         printf("# Outputs %d and %d (%s and %s) are equivalent\n",
  30.             i, j, PLA->label[ipart], PLA->label[jpart]);
  31.         some_equiv = TRUE;
  32.         } else if (check_equiv(F[i], R[j])) {
  33.         printf("# Outputs %d and NOT %d (%s and %s) are equivalent\n",
  34.             i, j, PLA->label[ipart], PLA->label[jpart]);
  35.         some_equiv = TRUE;
  36.         } else if (check_equiv(R[i], F[j])) {
  37.         printf("# Outputs NOT %d and %d (%s and %s) are equivalent\n",
  38.             i, j, PLA->label[ipart], PLA->label[jpart]);
  39.         some_equiv = TRUE;
  40.         } else if (check_equiv(R[i], R[j])) {
  41.         printf("# Outputs NOT %d and NOT %d (%s and %s) are equivalent\n",
  42.             i, j, PLA->label[ipart], PLA->label[jpart]);
  43.         some_equiv = TRUE;
  44.         }
  45.     }
  46.     }
  47.  
  48.     if (! some_equiv) {
  49.     printf("# No outputs are equivalent\n");
  50.     }
  51.  
  52.     for(i = 0; i < cube.part_size[cube.output]; i++) {
  53.     free_cover(F[i]);
  54.     free_cover(R[i]);
  55.     }
  56.     FREE(F);
  57.     FREE(R);
  58. }
  59.  
  60.  
  61.  
  62. int check_equiv(f1, f2)
  63. pcover f1, f2;
  64. {
  65.     register pcube *f1list, *f2list;
  66.     register pcube p, last;
  67.  
  68.     f1list = cube1list(f1);
  69.     foreach_set(f2, last, p) {
  70.     if (! cube_is_covered(f1list, p)) {
  71.         return FALSE;
  72.     }
  73.     }
  74.     free_cubelist(f1list);
  75.  
  76.     f2list = cube1list(f2);
  77.     foreach_set(f1, last, p) {
  78.     if (! cube_is_covered(f2list, p)) {
  79.         return FALSE;
  80.     }
  81.     }
  82.     free_cubelist(f2list);
  83.  
  84.     return TRUE;
  85. }
  86.